package service;

import entity.User;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

public interface UserService extends dao.UserDAO {

    enum UserGameResult {win, lost, run, draw};

    /**
     * 获取已登录的用户信息
     * @return 已登录的用户信息，用户未登录返回null
     */
    User getUserInfo(HttpSession session);

    /**
     * 注册并登录
     * @param session 会话
     * @param uname 用户名
     * @param unick 昵称
     * @param upass 登录口令经过B端SHA256加密后传输到服务器的副本
     * @return 注册成功返回用户实体，注册失败返回null
     */
    User registerLogin(HttpSession session, String uname, String unick, String upass);

    /**
     * 检查会话是否已登录
     * @param session 会话
     * @return 已登录返回用户信息，未登录返回null
     */
    User isLoggedIn(HttpSession session);

    /**
     * 用户登录
     * @param session 会话id
     * @param username 用户名
     * @param pass256 登录口令经过B端SHA256加密后传输到服务器的副本
     * @return 登录成功返回用户实体，登录失败返回null
     */
    User login(HttpSession session, String username, String pass256);

    /**
     * 上传头像
     * @param req 上传请求
     * @return 新头像的URI地址
     */
    String putHeadPic(HttpServletRequest req);

    /**
     * 更改昵称
     * @param session 会话
     * @param nickname 新的昵称
     * @return 更改后(不管成功与否)的用户昵称
     */
    String changeNickname(HttpSession session, String nickname);

    /**
     * 更改口令
     * @param session 会话
     * @param newPass256 新口令的SHA256哈希
     * @return 更改成功返回新口令的MD5哈希，否则返回null
     */
    String changePassword(HttpSession session, /*String oldPass256, */String newPass256);

    /**
     * 用户登出
     * @param session 会话
     * @return 登出成功返回true，失败返回null
     */
    boolean logOut(HttpSession session);

    /**
     * 提交更新用户的游戏记录
     * @param u 用户信息
     * @param result 输赢结果
     */
    void commitGameResult(User u, UserGameResult result, long score);

    /**
     * 用户加入或退出排行榜
     * @param u 用户
     * @param join true表示加入，false表示退出
     */
    void joinRank(User u, boolean join);

    /**
     * 根据用户昵称搜索用户
     * @param unick 指定的昵称
     * @return 用户列表
     */
    List<User> searchByNick(String unick);
}
